package com.school.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.school.domain.dto.product.ProductDTO;
import com.school.domain.dto.product.SelectProductDTO;
import com.school.domain.dto.product.UpdateProductDTO;
import com.school.domain.po.Product;
import com.school.domain.vo.PageVO;
import com.school.mapper.ProductDao;
import com.school.service.ProductService;
import org.springframework.stereotype.Service;

/**
 * <p>
 * 货物信息表 服务实现类
 * </p>
 *
 * @author Forever
 * @since 2025-07-05
 */
@Service
public class ProductServiceImpl extends ServiceImpl<ProductDao, Product> implements ProductService {

    @Override
    public String addProduct(ProductDTO productDTO) {
        if (BeanUtil.isEmpty(productDTO)) throw new RuntimeException("参数错误");
        Product product = BeanUtil.copyProperties(productDTO, Product.class);
        return save(product) ? "添加成功" : "添加失败";
    }

    @Override
    public String deleteProduct(String skuCode) {
        if (StrUtil.isEmpty(skuCode)) throw new RuntimeException("未传入编码");
        return remove(new LambdaQueryWrapper<Product>()
                .eq(Product::getSkuCode, skuCode)) ? "删除成功" : "删除失败";
    }

    @Override
    public String updateProduct(UpdateProductDTO updateProductDTO) {
        boolean isUpdate = lambdaUpdate()
                // 设置修改对应编码的条件
                .eq(Product::getSkuCode, updateProductDTO.getSkuCode())
                // 设置修改的字段
                .set(StrUtil.isNotEmpty(updateProductDTO.getProductName()),
                        Product::getProductName, updateProductDTO.getProductName())
                .set(StrUtil.isNotEmpty(updateProductDTO.getSpecification()),
                        Product::getSpecification, updateProductDTO.getSpecification())
                .set(StrUtil.isNotEmpty(updateProductDTO.getUnit()),
                        Product::getUnit,updateProductDTO.getUnit())
                .update();
        return isUpdate ? "修改货物成功" : "修改货物失败";
    }

    @Override
    public PageVO<Product> selectProduct(SelectProductDTO selectProductDTO) {
        Page<Product> productPage = lambdaQuery()
                // 货物名称
                .like(StrUtil.isNotEmpty(selectProductDTO.getProductName()),
                        Product::getProductName, selectProductDTO.getProductName())
                // 规格
                .like(StrUtil.isNotEmpty(selectProductDTO.getSpecification()),
                        Product::getSpecification, selectProductDTO.getSpecification())
                // SKU编码
                .eq(selectProductDTO.getSkuCode() != null,
                        Product::getSkuCode, selectProductDTO.getSkuCode())
                // 大于等于开始的创建时间
                .ge(selectProductDTO.getCreateTimeStart() != null, Product::getCreateTime,
                        selectProductDTO.getCreateTimeStart())
                // 小于等于结束的创建时间
                .le(selectProductDTO.getCreateTimeEnd() != null, Product::getCreateTime,
                        selectProductDTO.getCreateTimeEnd())
                // 创建时间倒序
                .orderByDesc(Product::getCreateTime)
                // 分页
                .page(new Page<>(selectProductDTO.getPageNum(), selectProductDTO.getPageSize()));
        return PageVO.MPPageToPageVO(productPage);
    }
}
